// 实现项目的唯一id编号

#include <iostream>
#include <atomic>
#include <sstream>
#include <string>
#include <random>
#include <iomanip>

namespace bite_im
{
    // 可以结合mac地址来使得uuid更加具有随机性

    // 生成16位随机字符的静态函数类
    class UUID
    {
    public:
        static std::string uuid()
        {
            // 生成12位随机16进制字符---作为随机
            std::random_device rd;                                   // 设备随机数对象，用于生成随机数-真随机
            std::mt19937 generator(rd());                            // 以设备随机数为种子，实例化伪随机数对象
            std::uniform_int_distribution<int> distribution(0, 255); // 限制数字范围

            std::stringstream ss;
            for (int i = 0; i < 6; i++)
            {
                if (i == 2 || i == 4)
                {
                    ss << "-";
                }
                // 当出现某个数16进制长度为1时，在前面补充一个0
                ss << std::setw(2) << std::setfill('0') << std::hex << distribution(generator);
            }
            ss << "-";
            // 再按顺序生成4位的16进制字符--用作编号
            static std::atomic<short> idx(0);
            short tmp = idx.fetch_add(1);
            ss << std::setw(4) << std::setfill('0') << std::hex << tmp;
            return ss.str();
        }
    };
    class VerifyCode
    {
    public:
        static std::string code()
        {
            std::random_device rd;                                 // 设备随机数对象，用于生成随机数-真随机
            std::mt19937 generator(rd());                          // 以设备随机数为种子，实例化伪随机数对象
            std::uniform_int_distribution<int> distribution(0, 9); // 限制数字范围
            std::stringstream ss;
            for (int i = 0; i < 4; i++)
            {
                ss << distribution(generator);
            }
            return ss.str();
        }
    };
}